{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. Import libraries "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Ensure the scripts directory is in your Python path\n",
    "import sys\n",
    "import os\n",
    "sys.path.append(os.path.abspath('../script'))\n",
    "\n",
    "# Import the necessary class from data_preprocessing.py\n",
    "from data_preprocessing import DataPreprocessor\n",
    "\n",
    "# Initialize the preprocessor\n",
    "preprocessor = DataPreprocessor(file_path=\"../src/data/MachineLearningRating_v3.txt\", delimiter=\"|\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "e:\\OnlineClass\\AIM\\Car-Insurance-Analytics-and-Modeling\\script\\data_preprocessing.py:26: DtypeWarning: Columns (32,37) have mixed types. Specify dtype option on import or set low_memory=False.\n",
      "  self.data = pd.read_csv(self.file_path, delimiter=self.delimiter)\n",
      "2025-03-12 12:52:40,037 - INFO - Data loaded successfully.\n"
     ]
    }
   ],
   "source": [
    "# Load the data\n",
    "preprocessor.load_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. Data Summarization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Get a quick overview of the dataset, including column names, data types, and descriptive statistics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1000098 entries, 0 to 1000097\n",
      "Data columns (total 52 columns):\n",
      " #   Column                    Non-Null Count    Dtype  \n",
      "---  ------                    --------------    -----  \n",
      " 0   UnderwrittenCoverID       1000098 non-null  int64  \n",
      " 1   PolicyID                  1000098 non-null  int64  \n",
      " 2   TransactionMonth          1000098 non-null  object \n",
      " 3   IsVATRegistered           1000098 non-null  bool   \n",
      " 4   Citizenship               1000098 non-null  object \n",
      " 5   LegalType                 1000098 non-null  object \n",
      " 6   Title                     1000098 non-null  object \n",
      " 7   Language                  1000098 non-null  object \n",
      " 8   Bank                      854137 non-null   object \n",
      " 9   AccountType               959866 non-null   object \n",
      " 10  MaritalStatus             991839 non-null   object \n",
      " 11  Gender                    990562 non-null   object \n",
      " 12  Country                   1000098 non-null  object \n",
      " 13  Province                  1000098 non-null  object \n",
      " 14  PostalCode                1000098 non-null  int64  \n",
      " 15  MainCrestaZone            1000098 non-null  object \n",
      " 16  SubCrestaZone             1000098 non-null  object \n",
      " 17  ItemType                  1000098 non-null  object \n",
      " 18  mmcode                    999546 non-null   float64\n",
      " 19  VehicleType               999546 non-null   object \n",
      " 20  RegistrationYear          1000098 non-null  int64  \n",
      " 21  make                      999546 non-null   object \n",
      " 22  Model                     999546 non-null   object \n",
      " 23  Cylinders                 999546 non-null   float64\n",
      " 24  cubiccapacity             999546 non-null   float64\n",
      " 25  kilowatts                 999546 non-null   float64\n",
      " 26  bodytype                  999546 non-null   object \n",
      " 27  NumberOfDoors             999546 non-null   float64\n",
      " 28  VehicleIntroDate          999546 non-null   object \n",
      " 29  CustomValueEstimate       220456 non-null   float64\n",
      " 30  AlarmImmobiliser          1000098 non-null  object \n",
      " 31  TrackingDevice            1000098 non-null  object \n",
      " 32  CapitalOutstanding        1000096 non-null  object \n",
      " 33  NewVehicle                846803 non-null   object \n",
      " 34  WrittenOff                358197 non-null   object \n",
      " 35  Rebuilt                   358197 non-null   object \n",
      " 36  Converted                 358197 non-null   object \n",
      " 37  CrossBorder               698 non-null      object \n",
      " 38  NumberOfVehiclesInFleet   0 non-null        float64\n",
      " 39  SumInsured                1000098 non-null  float64\n",
      " 40  TermFrequency             1000098 non-null  object \n",
      " 41  CalculatedPremiumPerTerm  1000098 non-null  float64\n",
      " 42  ExcessSelected            1000098 non-null  object \n",
      " 43  CoverCategory             1000098 non-null  object \n",
      " 44  CoverType                 1000098 non-null  object \n",
      " 45  CoverGroup                1000098 non-null  object \n",
      " 46  Section                   1000098 non-null  object \n",
      " 47  Product                   1000098 non-null  object \n",
      " 48  StatutoryClass            1000098 non-null  object \n",
      " 49  StatutoryRiskType         1000098 non-null  object \n",
      " 50  TotalPremium              1000098 non-null  float64\n",
      " 51  TotalClaims               1000098 non-null  float64\n",
      "dtypes: bool(1), float64(11), int64(4), object(36)\n",
      "memory usage: 390.1+ MB\n",
      "None\n",
      "   UnderwrittenCoverID  PolicyID     TransactionMonth  IsVATRegistered  \\\n",
      "0               145249     12827  2015-03-01 00:00:00             True   \n",
      "1               145249     12827  2015-05-01 00:00:00             True   \n",
      "2               145249     12827  2015-07-01 00:00:00             True   \n",
      "3               145255     12827  2015-05-01 00:00:00             True   \n",
      "4               145255     12827  2015-07-01 00:00:00             True   \n",
      "\n",
      "  Citizenship          LegalType Title Language                 Bank  \\\n",
      "0              Close Corporation    Mr  English  First National Bank   \n",
      "1              Close Corporation    Mr  English  First National Bank   \n",
      "2              Close Corporation    Mr  English  First National Bank   \n",
      "3              Close Corporation    Mr  English  First National Bank   \n",
      "4              Close Corporation    Mr  English  First National Bank   \n",
      "\n",
      "       AccountType  ...                    ExcessSelected CoverCategory  \\\n",
      "0  Current account  ...             Mobility - Windscreen    Windscreen   \n",
      "1  Current account  ...             Mobility - Windscreen    Windscreen   \n",
      "2  Current account  ...             Mobility - Windscreen    Windscreen   \n",
      "3  Current account  ...  Mobility - Metered Taxis - R2000    Own damage   \n",
      "4  Current account  ...  Mobility - Metered Taxis - R2000    Own damage   \n",
      "\n",
      "    CoverType            CoverGroup              Section  \\\n",
      "0  Windscreen  Comprehensive - Taxi  Motor Comprehensive   \n",
      "1  Windscreen  Comprehensive - Taxi  Motor Comprehensive   \n",
      "2  Windscreen  Comprehensive - Taxi  Motor Comprehensive   \n",
      "3  Own Damage  Comprehensive - Taxi  Motor Comprehensive   \n",
      "4  Own Damage  Comprehensive - Taxi  Motor Comprehensive   \n",
      "\n",
      "                           Product StatutoryClass StatutoryRiskType  \\\n",
      "0  Mobility Metered Taxis: Monthly     Commercial     IFRS Constant   \n",
      "1  Mobility Metered Taxis: Monthly     Commercial     IFRS Constant   \n",
      "2  Mobility Metered Taxis: Monthly     Commercial     IFRS Constant   \n",
      "3  Mobility Metered Taxis: Monthly     Commercial     IFRS Constant   \n",
      "4  Mobility Metered Taxis: Monthly     Commercial     IFRS Constant   \n",
      "\n",
      "   TotalPremium TotalClaims  \n",
      "0     21.929825         0.0  \n",
      "1     21.929825         0.0  \n",
      "2      0.000000         0.0  \n",
      "3    512.848070         0.0  \n",
      "4      0.000000         0.0  \n",
      "\n",
      "[5 rows x 52 columns]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-03-12 12:53:55,429 - INFO - Data summary provided.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "       UnderwrittenCoverID      PolicyID    PostalCode        mmcode  \\\n",
      "count         1.000098e+06  1.000098e+06  1.000098e+06  9.995460e+05   \n",
      "mean          1.048175e+05  7.956682e+03  3.020601e+03  5.487770e+07   \n",
      "std           6.329371e+04  5.290039e+03  2.649854e+03  1.360381e+07   \n",
      "min           1.000000e+00  1.400000e+01  1.000000e+00  4.041200e+06   \n",
      "25%           5.514300e+04  4.500000e+03  8.270000e+02  6.005692e+07   \n",
      "50%           9.408300e+04  7.071000e+03  2.000000e+03  6.005842e+07   \n",
      "75%           1.391900e+05  1.107700e+04  4.180000e+03  6.005842e+07   \n",
      "max           3.011750e+05  2.324600e+04  9.870000e+03  6.506535e+07   \n",
      "\n",
      "       RegistrationYear      Cylinders  cubiccapacity      kilowatts  \\\n",
      "count      1.000098e+06  999546.000000  999546.000000  999546.000000   \n",
      "mean       2.010225e+03       4.046642    2466.743258      97.207919   \n",
      "std        3.261391e+00       0.294020     442.800640      19.393256   \n",
      "min        1.987000e+03       0.000000       0.000000       0.000000   \n",
      "25%        2.008000e+03       4.000000    2237.000000      75.000000   \n",
      "50%        2.011000e+03       4.000000    2694.000000     111.000000   \n",
      "75%        2.013000e+03       4.000000    2694.000000     111.000000   \n",
      "max        2.015000e+03      10.000000   12880.000000     309.000000   \n",
      "\n",
      "       NumberOfDoors  CustomValueEstimate  NumberOfVehiclesInFleet  \\\n",
      "count  999546.000000         2.204560e+05                      0.0   \n",
      "mean        4.019250         2.255311e+05                      NaN   \n",
      "std         0.468314         5.645157e+05                      NaN   \n",
      "min         0.000000         2.000000e+04                      NaN   \n",
      "25%         4.000000         1.350000e+05                      NaN   \n",
      "50%         4.000000         2.200000e+05                      NaN   \n",
      "75%         4.000000         2.800000e+05                      NaN   \n",
      "max         6.000000         2.655000e+07                      NaN   \n",
      "\n",
      "         SumInsured  CalculatedPremiumPerTerm  TotalPremium   TotalClaims  \n",
      "count  1.000098e+06              1.000098e+06  1.000098e+06  1.000098e+06  \n",
      "mean   6.041727e+05              1.178757e+02  6.190550e+01  6.486119e+01  \n",
      "std    1.508332e+06              3.997017e+02  2.302845e+02  2.384075e+03  \n",
      "min    1.000000e-02              0.000000e+00 -7.825768e+02 -1.200241e+04  \n",
      "25%    5.000000e+03              3.224800e+00  0.000000e+00  0.000000e+00  \n",
      "50%    7.500000e+03              8.436900e+00  2.178333e+00  0.000000e+00  \n",
      "75%    2.500000e+05              9.000000e+01  2.192982e+01  0.000000e+00  \n",
      "max    1.263620e+07              7.442217e+04  6.528260e+04  3.930921e+05  \n"
     ]
    }
   ],
   "source": [
    "# Summarize the data\n",
    "preprocessor.summarize_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. Data Quality Assessment"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.1 Check for Duplicates\n",
    "\n",
    "Identify any duplicated rows or columns in the dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-03-12 12:54:10,113 - INFO - Checked duplicates. Rows: 0, Columns: []\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Duplicated rows: 0\n",
      "Duplicated columns: []\n"
     ]
    }
   ],
   "source": [
    "# Check for duplicates\n",
    "preprocessor.check_duplicates()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.2 Handling missing values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "e:\\OnlineClass\\AIM\\Car-Insurance-Analytics-and-Modeling\\script\\data_preprocessing.py:62: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
      "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
      "\n",
      "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
      "\n",
      "\n",
      "  self.data['NewVehicle'].fillna(self.data['NewVehicle'].mode()[0], inplace=True)\n",
      "e:\\OnlineClass\\AIM\\Car-Insurance-Analytics-and-Modeling\\script\\data_preprocessing.py:63: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
      "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
      "\n",
      "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
      "\n",
      "\n",
      "  self.data['Bank'].fillna('Unknown', inplace=True)\n",
      "e:\\OnlineClass\\AIM\\Car-Insurance-Analytics-and-Modeling\\script\\data_preprocessing.py:64: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
      "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
      "\n",
      "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
      "\n",
      "\n",
      "  self.data['AccountType'].fillna('Unknown', inplace=True)\n",
      "2025-03-12 12:54:17,077 - INFO - Missing values handled.\n"
     ]
    }
   ],
   "source": [
    "# Handle missing values\n",
    "preprocessor.handle_missing_values()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.3 Remove Negative Values\n",
    "\n",
    "Remove any rows with negative values in TotalPremium or TotalClaims:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Negative rows before removal: 291\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-03-12 12:54:22,993 - INFO - Removed rows with negative values. Total removed: 291\n"
     ]
    }
   ],
   "source": [
    "# Remove negative values\n",
    "preprocessor.remove_negative_values()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.4: Remove Whitespace\n",
    "\n",
    "Trim leading and trailing whitespaces from all string columns in the dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "e:\\OnlineClass\\AIM\\Car-Insurance-Analytics-and-Modeling\\script\\data_preprocessing.py:88: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n",
      "  self.data = self.data.applymap(lambda x: x.strip() if isinstance(x, str) else x)\n",
      "2025-03-12 12:54:45,416 - INFO - Leading and trailing whitespaces removed.\n"
     ]
    }
   ],
   "source": [
    "# Remove leading and trailing whitespaces\n",
    "preprocessor.strip_whitespace()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.5: Handle Outliers\n",
    "\n",
    "Call the outlier_handling function to visualize outliers, calculate quantile thresholds, and summarize key statistics for TotalPremium and TotalClaims:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Boxplots for 'TotalPremium' and 'TotalClaims':\n"
     ]
    },
    {
     "data": {
      "image/png": "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6Vx44YXZtGlTpk6dWpbPBQAAWpt7ogMAwB5ozZo1Oeuss/LGG2+kV69eOfHEE/Pwww+nV69eSZJ58+alQ4cOOeOMM7J58+aMGzcut956a9P1HTt2zP33358LL7wwo0aNSrdu3TJlypRcd911TWMGDRqUJUuW5LLLLsvNN9+cfv365fbbb8+4ceOaxpx55plZt25dZs6cmbVr12b48OFZunTpNg8bBQCAPVVFaS+9SVZjY2Nqamqyfv1691gE2I6KioodHruX/tgAaDX60J3nMwPYcXp3gNazo32o27kAAAAAAEABIToAAAAAABQQogMAAAAAQAEhOgAAAAAAFBCiAwAAAABAASE6AAAAAAAUEKIDAAAAAEABIToAAAAAABQQogMAAAAAQAEhOgAAAAAAFBCiAwAAAABAASE6AAAAAAAUEKIDAAAAAEABIToAAAAAABQQogMAAAAAQAEhOgAAAAAAFBCiAwAAAABAASE6AAAAAAAUEKIDAAAAAEABIToAAAAAABQQogMAAAAAQAEhOgAAAAAAFBCiAwAAAABAASE6AAAAAAAUEKIDAAAAAEABIToAAAAAABQQogMAAAAAQAEhOgAAAAAAFBCiAwAAAABAASE6AAAAAAAUEKIDAAAAAEABIToAAAAAABQQogMAAAAAQAEhOgAAAAAAFBCiAwAAAABAASE6AAAAAAAUEKIDAAAAAEABIToAAAAAABQQogMAAAAAQAEhOgAAAAAAFBCiAwAAAABAASE6AAAAAAAUEKIDAAAAAECBTuUuAICd89aWrXl+3cayrf/ky+tbdb7BvarStXPHVp0TAAAAoLUI0QH2MM+v25gJt/yxbOu39tr3/8eJOfJjNa06JwAAAEBrEaID7GEG96rK/f9xYqvOOey/dnxsa689uFdVq84HAAAA0JqE6AB7mK6dO5Z157Zd4wAAAMC+xINFAUipVGrVcQAAAAB7CyE6AEm2H5AL0AEAAIB9kRAdgCZFQbkAHQAAANhXCdEBaKZUKuWJNW9mwH/enyfWvClABwAAAPZpHiwK0IpefH1TNm1+t9xlfGTPvbax2Z97sm6VnTKoZ7dylwEAAADsodp1iP79738/3/3ud7N27docffTRueWWW3LccceVuyyAFr34+qacfOP/LXcZrerSu1eVu4RW8fsZYwTpAG1M7w4AwN6q3Ybod999d+rr67NgwYJ88pOfzPz58zNu3Lg8++yz6d27d7nLA9jG+zvQ5585PEN6V5W5mo/m7Xe2Zs0/3kq/A7qmy34dy13OLnvutY259O5Ve8W3AwDaM707AAB7s3Ybos+dOzfTpk3L1KlTkyQLFizIkiVLcuedd+aqq64qc3UAxYb0rsqRH6spdxkf2bEDy10BAHsKvTsAAHuzdhmib9myJY8++miuvvrqpnMdOnTI2LFjs2LFihav2bx5czZv3tx03NjY2OZ1AnzQW+9sTUWnxjz43KN5sbHtdqJvfve9vNb4dpvNv7v1ru6Syk5t85zrv/39n6no5OcBQFvSuwN7qr9v2pJ7Vj2Vje/+vc3WeGvL1vz175tadc4uA7rs8Niv3f3LVl374//WLV07t+03Vf+918cy/vB/b9M1AHZWuwzRX3/99WzdujV9+vRpdr5Pnz555plnWrzmW9/6VubMmbM7ygNo0fOvbcx+Pf47d760LHmp3NXwvv16nJJulaeVuwyAvZbeHdhTPfA/a/PdFYtT2WtZuUvZKUPmDNnhscvfvrZV117+SqtO16LNK0/JIT2v3+NvkQnsXdpliL4rrr766tTX1zcdNzY2pn///mWsCNjXfPaI2mx457wcUP1/2mxndWIn+s7q272Ph4oCtDN6d6A9eL9/3/hu2224aIud6D/8z7N2eOyU//pJq669W3aij/yYAB1od9pliN6zZ8907Ngxr776arPzr776ampra1u8prKyMpWVlbujPIAW/Vu3zpk2eni5ywCA3UrvDuyp9tT+/VeX9sjatWu3O662tjYLzvxi2xcEsA9ou61/H0Hnzp1zzDHHZNmy//+Vqvfeey/Lli3LqFGjylgZAADwQXp3gN2roaGhVccBsH3tcid6ktTX12fKlCk59thjc9xxx2X+/PnZtGlTpk6dWu7SAACAD9C7A+xepVIpFRUVH/o+AK2n3YboZ555ZtatW5eZM2dm7dq1GT58eJYuXbrNA4sAAIDy0rsD7H6lUikHHXRQs1u71NbW2oEO0AYqSnvp/55sbGxMTU1N1q9fn+rq6nKXAwDAPkIfuvN8ZgAAlMOO9qHt8p7oAAAAAADQHgjRAQAAAACggBAdAAAAAAAKCNEBAAAAAKCAEB0AAAAAAAoI0QEAAAAAoIAQHQAAAAAACgjRAQAAAACggBAdAAAAAAAKCNEBAAAAAKCAEB0AAAAAAAoI0QEAAAAAoIAQHQAAAAAACgjRAQAAAACggBAdAAAAAAAKCNEBAAAAAKCAEB0AAAAAAAp0KncBbaVUKiVJGhsby1wJAAD7kvf7z/f7UbZP7w4AQDnsaO++14boGzZsSJL079+/zJUAALAv2rBhQ2pqaspdxh5B7w4AQDltr3evKO2lW2Tee++9vPLKK+nevXsqKirKXQ7AHqWxsTH9+/fP3/72t1RXV5e7HIA9SqlUyoYNG9K3b9906ODuiTtC7w6w6/TuALtuR3v3vTZEB2DXNTY2pqamJuvXr9eIAwBAO6Z3B2h7tsYAAAAAAEABIToAAAAAABQQogOwjcrKysyaNSuVlZXlLgUAAPgQeneAtuee6AAAAAAAUMBOdAAAAAAAKCBEBwAAAACAAkJ0AAAAAAAoIEQH2AtVVFTkl7/8ZbnLaNHs2bMzfPjwcpcBAADt3q709YsXL06PHj126pqBAwdm/vz5O3UNwL5EiA7QhioqKj70NXv27MJrX3rppVRUVGTVqlWtWkdNTU1Gjx6d3/3udx953l0xY8aMLFu2rCxrAwDArmgvfX2S/P73v8/48eNz4IEHZv/998/hhx+eyy+/PC+//PIuz7ly5cp85StfaZX6APZGQnSANtTQ0ND0mj9/fqqrq5udmzFjxm6rZdGiRWloaMjy5cvTs2fPTJgwIS+88EKLY9955502q6OqqioHHnhgm80PAACtrb309QsXLszYsWNTW1ube+65J0899VQWLFiQ9evX56abbtrleXv16pX999+/FSsF2LsI0QHaUG1tbdOrpqYmFRUVTce9e/fO3Llz069fv1RWVmb48OFZunRp07WDBg1KknziE59IRUVFxowZk+R/d4l85jOfSc+ePVNTU5OTTjopjz322HZr6dGjR2pra3PkkUfmtttuy1tvvZUHH3wwyf/urLntttty2mmnpVu3brnhhhuSJL/61a8yYsSIdOnSJQcffHDmzJmTd999t2nOioqKLFy4MBMmTMj++++fww47LCtWrMhzzz2XMWPGpFu3bjnhhBPy/PPPN13zr7dzGTNmTC699NJmtX7xi1/Meeed13Q8cODAXH/99amrq0tVVVUGDBiQ++67L+vWrcvEiRNTVVWVo446Ko888sgO/bsAAMDOaA99/Zo1azJ9+vRMnz49d955Z8aMGZOBAwfmU5/6VG6//fbMnDmzxeuef/75TJw4MX369ElVVVVGjhyZhx56qNmYf72dy670+atXr87JJ5+c7t27p7q6Osccc4z+HNhrCNEByuTmm2/OTTfdlBtvvDF//vOfM27cuJx22mn5y1/+kiT505/+lCR56KGH0tDQkHvvvTdJsmHDhkyZMiV//OMf8/DDD2fo0KEZP358NmzYsMNrd+3aNUmyZcuWpnOzZ8/OpEmT8sQTT+T888/PH/7wh9TV1eWSSy7JU089lYULF2bx4sVNAfv7vvGNb6Suri6rVq3KoYcemrPPPjtf/epXc/XVV+eRRx5JqVTKxRdf/JE+qySZN29eRo8enccffzxf+MIXcu6556auri7nnHNOHnvssQwePDh1dXUplUofeS0AANhRu6uv//nPf54tW7bkyiuvbPH9ovugb9y4MePHj8+yZcvy+OOP53Of+1xOPfXU/PWvf/3Qv9fO9vlf/vKX069fv6xcuTKPPvporrrqquy3334fugbAHqMEwG6xaNGiUk1NTdNx3759SzfccEOzMSNHjixddNFFpVKpVHrxxRdLSUqPP/74h867devWUvfu3Uu//vWvm84lKf3iF79o8XjTpk2liy66qNSxY8fS6tWrm96/9NJLm817yimnlL75zW82O3fXXXeVDjrooGbzXnPNNU3HK1asKCUp3XHHHU3nfvKTn5S6dOnSdDxr1qzS0Ucf3XR80kknlS655JJm60ycOLE0ZcqUpuMBAwaUzjnnnKbjhoaGUpLStddeu83aDQ0N//oRAQBAqylXX3/hhReWqqurd7q+lhxxxBGlW265pel4wIABpXnz5jVbd2f7/O7du5cWL1683foA9kR2ogOUQWNjY1555ZWMHj262fnRo0fn6aef/tBrX3311UybNi1Dhw5NTU1Nqqurs3Hjxu3uJDnrrLNSVVWV7t2755577skdd9yRo446qun9Y489ttn41atX57rrrktVVVXTa9q0aWloaMg///nPpnEfnKNPnz5JkmHDhjU79/bbb6exsfFD69ueHVknSV577bWPtA4AAOyo3dnXl0qlVFRU7HSNGzduzIwZM3LYYYelR48eqaqqytNPP73d3x92ts+vr6/PBRdckLFjx+bb3/52s1u9AOzpOpW7AAB2zpQpU/LGG2/k5ptvzoABA1JZWZlRo0Y1uzVLS+bNm5exY8empqYmvXr12ub9bt26NTveuHFj5syZk9NPP32bsV26dGn67w9+RfP9pr6lc++9916LdXXo0GGbW7C09GDTj7oOAAC0Jzvb1x9yyCFZv359GhoactBBB+3wOjNmzMiDDz6YG2+8MUOGDEnXrl0zefLk7f7+sLP99+zZs3P22WdnyZIl+c1vfpNZs2blpz/9aSZNmrTDtQK0V3aiA5RBdXV1+vbtm+XLlzc7v3z58hx++OFJks6dOydJtm7dus2Y6dOnZ/z48TniiCNSWVmZ119/fbtr1tbWZsiQIS0G6C0ZMWJEnn322QwZMmSbV4cOrffjo1evXmloaGg63rp1a5588slWmx8AANrK7uzrJ0+enM6dO+c73/lOi++/+eabLZ5fvnx5zjvvvEyaNCnDhg1LbW1tXnrppR38G+6cQw45JJdddlkeeOCBnH766Vm0aFGbrAOwu9mJDlAmV1xxRWbNmpXBgwdn+PDhWbRoUVatWpUf//jHSZLevXuna9euWbp0afr165cuXbqkpqYmQ4cOzV133ZVjjz02jY2NueKKK5oeFNqaZs6cmQkTJuTjH/94Jk+enA4dOmT16tV58sknc/3117faOp/+9KdTX1+fJUuWZPDgwZk7d27hLwAAANDe7K6+vn///pk3b14uvvjiNDY2pq6uLgMHDsyaNWvyox/9KFVVVbnpppu2uW7o0KG59957c+qpp6aioiLXXnttq39786233soVV1yRyZMnZ9CgQVmzZk1WrlyZM844o1XXASgXO9EBymT69Ompr6/P5ZdfnmHDhmXp0qW57777MnTo0CRJp06d8r3vfS8LFy5M3759M3HixCTJHXfckX/84x8ZMWJEzj333EyfPj29e/du9frGjRuX+++/Pw888EBGjhyZ448/PvPmzcuAAQNadZ3zzz8/U6ZMSV1dXU466aQcfPDBOfnkk1t1DQAAaCu7s6+/6KKL8sADD+Tll1/OpEmTcuihh+aCCy5IdXV1ZsyY0eI1c+fOzQEHHJATTjghp556asaNG5cRI0a06mfQsWPHvPHGG6mrq8shhxySL33pS/n85z+fOXPmtOo6AOVSUfrXG9ECAAAAAABJ7EQHAAAAAIBCQnQAAAAAACggRAcAAAAAgAJCdAAAAAAAKCBEBwAAAACAAkJ0AAAAAAAoIEQHAAAAAIACQnQAAAAAACggRAcAAAAAgAJCdAAAAAAAKCBEBwAAAACAAkJ0AAAAAAAo8P8AhGufHGn9w/IAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1500x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TotalPremium lower quantile (1%): 0.0\n",
      "TotalPremium upper quantile (99%): 778.698157894737\n",
      "TotalClaims lower quantile (1%): 0.0\n",
      "TotalClaims upper quantile (99%): 0.0\n",
      "Number of rows that would be removed: 12374\n",
      "\n",
      "Summary of 'TotalClaims':\n",
      "count    989266.000000\n",
      "mean         64.513788\n",
      "std        2374.776864\n",
      "min           0.000000\n",
      "25%           0.000000\n",
      "50%           0.000000\n",
      "75%           0.000000\n",
      "max      393092.105263\n",
      "Name: TotalClaims, dtype: float64\n",
      "95th percentile of 'TotalClaims': 0.0\n",
      "99.72th percentile of 'TotalClaims': 0.0\n",
      "Number of values greater than zero in 'TotalClaims': 2760\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-03-12 12:56:02,011 - INFO - Outlier handling completed.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of outliers in 'TotalPremium': 206450\n",
      "Number of outliers in 'TotalClaims': 2760\n"
     ]
    }
   ],
   "source": [
    "# Handle outliers\n",
    "preprocessor.outlier_handling()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After evaluating both quantile-based and IQR outlier detection methods, it is clear that the unique distribution of TotalClaims—with only 2760 positive values out of 989,266 total values and most values being zero—makes traditional outlier removal unsuitable. Applying these methods would eliminate all meaningful positive claim data, which is critical for analysis. Filtering based on the 99.9th percentile threshold resulted in minimal impact, removing only three rows while retaining all positive claims. Considering these results, it is recommended to keep the dataset as is without applying outlier removal, ensuring the integrity of the data for meaningful insights and modeling. This approach preserves the rare but significant positive claims while addressing the challenges posed by skewness."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4: Save the cleaned data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-03-12 12:56:44,802 - INFO - Cleaned data saved to ../src/data/cleaned_data.csv\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cleaned data saved to ../src/data/cleaned_data.csv\n"
     ]
    }
   ],
   "source": [
    "# Save the cleaned data\n",
    "preprocessor.save_cleaned_data(save_path=\"../src/data/cleaned_data.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5. Check the shape of the dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(989266, 46)\n"
     ]
    }
   ],
   "source": [
    "# Check the shape of the dataset\n",
    "print(preprocessor.data.shape)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
